/* eslint-disable no-console */
/* eslint-disable no-underscore-dangle */
/* eslint-disable camelcase */
/* eslint-disable  no-undef */
import { pathName } from 'src/setting';
import AMapLoader from '@amap/amap-jsapi-loader';

const { PI } = Math;
// 球体长半径
const SPHERE_RADIUS = 6378245.0;
// 扁率
const FLATNESS = 0.00669342162296594323;

function transformLat(inputLng, inputLat) {
  const lat = +inputLat;
  const lng = +inputLng;
  let ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
  ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;
  ret += ((20.0 * Math.sin(lat * PI) + 40.0 * Math.sin((lat / 3.0) * PI)) * 2.0) / 3.0;
  ret += ((160.0 * Math.sin((lat / 12.0) * PI) + 320 * Math.sin((lat * PI) / 30.0)) * 2.0) / 3.0;
  return ret;
}

function transformLng(inputLng, inputLat) {
  const lat = +inputLat;
  const lng = +inputLng;
  let ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
  ret += ((20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0) / 3.0;
  ret += ((20.0 * Math.sin(lng * PI) + 40.0 * Math.sin((lng / 3.0) * PI)) * 2.0) / 3.0;
  ret += ((150.0 * Math.sin((lng / 12.0) * PI) + 300.0 * Math.sin((lng / 30.0) * PI)) * 2.0) / 3.0;
  return ret;
}

/**
 * 判断是否在国内，不在国内则不做偏移
 * @param lng
 * @param lat
 * @returns {boolean}
 */
function outOfChina(inputLng, inputLat) {
  const lat = +inputLat;
  const lng = +inputLng;
  // 纬度 3.86~53.55, 经度 73.66~135.05
  return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55);
}

/**
 * wgs84 转 gcj02
 * 离线转换
 * @param inputLng
 * @param inputLat
 * @returns {number[]}
 */
function wgs84ToGcj02(inputLng, inputLat) {
  const lat = +inputLat;
  const lng = +inputLng;
  if (outOfChina(lng, lat)) {
    return [lng, lat];
  }
  let dLat = transformLat(lng - 105.0, lat - 35.0);
  let dLng = transformLng(lng - 105.0, lat - 35.0);
  const radLat = (lat / 180.0) * PI;
  let magic = Math.sin(radLat);
  magic = 1 - FLATNESS * magic * magic;
  const sqrtMagic = Math.sqrt(magic);
  dLat = (dLat * 180.0) / (((SPHERE_RADIUS * (1 - FLATNESS)) / (magic * sqrtMagic)) * PI);
  dLng = (dLng * 180.0) / ((SPHERE_RADIUS / sqrtMagic) * Math.cos(radLat) * PI);
  const mgLat = lat + dLat;
  const mgLng = lng + dLng;
  return [mgLng, mgLat];
}

/**
 * 中心点同步
 * @param {*} mapboxMap
 * @param {*} amapMap
 */
function linkAMap(mapboxMap, amapMap) {
  const mapboxZoom = mapboxMap.getZoom() + 1;
  const mapboxCenter = mapboxMap.getCenter();
  mapboxMap.dragRotate.disable();
  amapMap.setZoom(mapboxZoom);
  amapMap.setCenter(wgs84ToGcj02(mapboxCenter.lng, mapboxCenter.lat));
}

/**
 * 设置高德安全密钥
 * 申请地址：https://console.amap.com/dev/key/app
 * 样式地址：https://lbs.amap.com/api/jsapi-v2/guide/map/map-style
 * 自定义样式：https://geohub.amap.com/mapstyle/index
 * @param {*} code
 */
function setJsCode(code) {
  if (!window._AMapSecurityConfig) {
    window._AMapSecurityConfig = { securityJsCode: code };
  } else {
    AMapLoader.reset();
    window._AMapSecurityConfig.securityJsCode = code;
  }
}

export default {
  baseUrl: window.origin,
  styleType: 'mapbox',
  jServer: {
    version: 8,
    glyphs: `just://api.justserver.com/${pathName}/{fontstack}/{range}.pbf`,
    sources: {},
    layers: [],
  },
  init: (mapboxMap, id, { pitch, param }) => {
    const pm = param.split(',');
    setJsCode(pm[2]);
    return new Promise((resolve) => {
      AMapLoader.load({
        key: pm[1], // 申请好的Web端开发者Key，首次调用 load 时必填
        version: '2.0', // 指定要加载的 JSAPI 的版本，缺省时默认为 1.4.15
        plugins: [], // 需要使用的的插件列表，如比例尺'AMap.Scale'等
      })
        .then((AMap) => {
          const { lng, lat } = mapboxMap.getCenter();
          const aMapCenter = wgs84ToGcj02(lng, lat);
          const zoom = mapboxMap.getZoom() + 1;
          const amapMap = new AMap.Map(`other_contener_${id}`, {
            viewMode: '3D',
            zoom, // 初始化地图层级
            center: aMapCenter, // 初始化地图中心点
            showIndoorMap: false,
            resizeEnable: true,
            animateEnable: false,
            isHotspot: false,
            keyboardEnable: false,
            jogEnable: false,
            pitch,
            mapStyle: pm[3],
          });
          mapboxMap.on('move', () => {
            linkAMap(mapboxMap, amapMap);
          });

          mapboxMap.on('zoom', () => {
            linkAMap(mapboxMap, amapMap);
          });
          // 更新高德地图
          amapMap.customMapUpdate = (option) => {
            amapMap.setPitch(option.pitch);
            amapMap.setZoom(option.zoom + 1);
            amapMap.setCenter(wgs84ToGcj02(option.center[0], option.center[1]));
          };
          resolve(amapMap);
        })
        .catch((e) => {
          console.log(e);
        });
    });
  },
};
